<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>作用域</title>
    <script>
        // var a = '好久不见';
        // d = '香港';
        // console.log(d); // 香港
        // function fn(num){ // 局部作用域，
        //     var b = '陈喜讯';
        //     console.log(b);  // 可以拿到
        //     c = 'hong kong'; // 在局部作用域中，3.新来的变量如果没有var 声明，则为全局变量
        // }
        // fn(123); 
        // console.log(num); // num is not defined 3. **形参实际上就是局部变量**
        // console.log(c);  // hong kong
        // console.log(b);  // b is not defined，报错，1.因为b是局部变量只能在函数内部使用



        // function f1() {
        //     // var num = 123;
        //     function f2() {
        //         console.log( num );   // 打印456，就近原则,先在自己的作用域中查找，找不到就去上一级找，就去全局中找，作用域链
        //     }
        //     f2();
        // }
        // var num = 456;
        // f1();


    // var sub = '数学';
    // function subject(){
    //     console.log(sub);  // 现在当前作用域中找，先使用，在声明，得到的值是undefined
    //     var sub = '英语';  
    //     console.log(sub)   // 英语
    // }
    // subject();
    // console.log(sub); // subject 结束执行后，出来的，因此 函数里面的var sub 已经被销毁， 数学



    // var sub = '数学';
    // function subject(){
    //     console.log(sub);  // 数学
    //     name = '周老师';   // 在函数内不适用var声明的变量是全局变量，所以此时外面能够访问到
    //     console.log(name)   //  周老师
    // }
    // subject();
    // console.log(sub); // 数学
    // console.log(name); // 周老师，所以此时外面能够访问到


    // var sub = '数学';
    // function subject(){
    //     console.log(sub);  // 数学
    //     sub = '英语';  
    //     console.log(sub)   // 英语
    // }
    // subject();
    // console.log(sub);  // 英语


    // var sub = '数学';
    // function subject(){
    //     console.log(sub);  // undefined
    //     var sub = '英语';  
    //     console.log(sub)   // 英语
    // }
    // subject();
    // console.log(sub);  // 数学



    // 函数声明
    // 命名函数，会存在函数提升，会把函数提升到当前作用域的最上面
    // aa();
    // function aa(){
    //     alert()
    // }
    
    // // var bb;
    // // bb(); // 报错
    // var bb = function(){
    //     alert();
    // }

    // // var 声明的变量存在预解析（变量的声明会被提升（当前作用域的最上面），赋值不会被提升），
    // // var num;
    // console.log(num);  // undefined
    // var num = 123;





    // var num = 10;
    // fun();

    // function fun() {
    //     // var num;
    //     console.log(num);  // undefined
    //     var num = 20;
    // }

    // var num = 10;
    // fun();

    // function fun() {
    //     console.log(num);  // 10
    //     num = 20;
    // }
    
    // var num = 10;
    // c();  // c is not a function,报错

    // var c = function fun() {
    //     console.log(num);
    //     var num = 20;
    // }


    // var num = 10;
    // var c = function fun() {
    //     console.log(num);  // undefined
    //     var num = 20;
    // }
    // c();

    
    var num = 10;   // 全局变量
    var c = function fun() {
        console.log(num);  // 10
        num = 20;
    }
    console.log('智：'+num)  // 10
    c();
    console.log(num)  // 20










    </script>
</head>
<body>
    
</body>
</html>